import poplib
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
import os
from datetime import datetime, timedelta
import pickle
import requests

# 市场部群机器人
MARKET_ROBOT_URL = os.getenv("WEIXIN_ROBOT_URL")
# 销售群机器人
SALE_ROBOT_URL = os.getenv("WEIXIN_ROBOT_URL")
# 人事部群机器人
HR_ROBOT_URL = os.getenv("WEIXIN_ROBOT_URL")
# 行政部群机器人
ROBOT_URL = os.getenv("WEIXIN_ROBOT_URL")

try:
    # 从pkl文件中读取数据
    with open('last_email.pkl', 'rb') as file:
        last_email = pickle.load(file)
except:
    # 如果文件不存在，则初始化为当前时间前1天
    # rece_time = datetime.today() - timedelta(days=1),
    rece_time = datetime.today() - timedelta(minutes=20)
    last_email = {
        'email_from': 'example1@163.com',
        'receive_time': rece_time.strftime('%Y-%m-%d %H:%M:%S'),
        'email_subject': 'None'
    }

# 邮件主题关键词分类
TARGET = [
    ("展会", "展览", "广交会"),
    ("咨询", "销售", "商品"),
    ("简历", "招聘", "求职")
]

def send_msg_to_weixin(content, url=ROBOT_URL):
    """
    发送消息到企业微信群
    """
    data = {
        "msgtype": "text",
        "text": {
            "content": content,
            "mentioned_list": ["@all"]
        }
    }
    response = requests.post(url=url, json=data)
    if response.status_code == 200:
        print("成功发送企业微信消息")
    else:
        print("发送企业微信消息失败")
def parse_mail_time(mail_datetime):
    # 定义邮件时间解析函数
    # 定义GMT时间格式
    GMT_FORMAT = "%a, %d %b %Y %H:%M:%S"
    # 查找'+0'的位置
    index = mail_datetime.find(' +0')
    # 如果存在时区信息，则去掉时区信息
    if index > 0:
        mail_datetime = mail_datetime[:index]
    try:
        # 将字符串解析为datetime对象
        mail_datetime = datetime.strptime(mail_datetime, GMT_FORMAT)
        return mail_datetime
    except:
        # 如果解析出错，则打印错误信息并返回None
        print("邮件时间格式解析错误：" + mail_datetime)
        return None


def send_content_to_wx(msg):
    from_addr = parseaddr(msg.get('From'))[1]
    to_addr = parseaddr(msg.get('To'))[1]
    subject = decode_header(msg.get('Subject'))
    subject = subject[0][0].decode(subject[0][1]) if subject[0][1] else subject[0][0]
    # 获取邮件的正文
    for part in msg.walk():
        if part.get_content_type() == 'text/plain' or part.get_content_type() == 'text/html':
            body = part.get_payload(decode=True).decode(part.get_content_charset() or 'utf-8')

    email_content = f"""
    发送方:{from_addr}
    接收方:{to_addr}
    主题：{subject}
    正文：{body}
    """
    # 判断邮件类型，发送到对应群
    # 是否为市场部
    for key in TARGET[0]:
        if key in subject:
            send_msg_to_weixin(email_content,url=MARKET_ROBOT_URL)
            # 发送后可以返回
            return

    # 是否为销售部
    for key in TARGET[1]:
        if key in subject:
            send_msg_to_weixin(email_content, url=SALE_ROBOT_URL)
            return

    # 是否为人事部
    for key in TARGET[2]:
        if key in subject:
            send_msg_to_weixin(email_content, url=HR_ROBOT_URL)
            return
    # 如果都不是，默认发到行政部
    send_msg_to_weixin(email_content)

def connect_email_by_pop3():
    # 这个是163邮箱的pop3的服务器地址
    # 各个公司的邮箱平台的POP3的服务器地址都是不同的，自己网上查询下即可
    pop3_server = 'pop.163.com'
    # 163邮箱的端口
    # 如果设置POP3的SSL加密方式连接的话，则端口为：995，否则就是端口为110
    port = 110
    # 你的邮箱地址和密码
    username = os.getenv("EMAIL")
    password = os.getenv("PASSWORD")
    # 连接到POP3服务器
    server = poplib.POP3(pop3_server, port)
    # 登录邮箱
    server.user(username)
    server.pass_(password)
    return server

def parse_email_server(email_server, last_email):
    def get_email_content(email_server, index):
        # 倒序遍历邮件，这样取到的第一封就是最新邮件
        resp, lines, octets = email_server.retr(index)
        # lines存储了邮件的原始文本的每一行,
        # 邮件的原始文本:# lines是邮件内容，列表形式使用join拼成一个byte变量
        msg_content = b'\r\n'.join(lines).decode('utf-8')
        # 解析邮件:
        return Parser().parsestr(msg_content)

    resp, mails, octets = email_server.list()
    num, total_size = email_server.stat()
    print("邮件数量为：" + str(num))
    # mails存储了邮件编号列表，
    index = len(mails)
    # 上一次邮件接收时间
    last_receive_time = datetime.strptime(
        last_email.get('receive_time'),
        "%Y-%m-%d %H:%M:%S")
    # 倒序遍历邮件
    for i in range(index, 0, -1):
        msg = get_email_content(email_server, i)
        # 邮件时间,解析时间格式
        mail_datetime = parse_mail_time(msg.get("date"))
        if mail_datetime:
            if mail_datetime <= last_receive_time:
                # 旧邮件不处理，后面的邮件都是旧邮件，可以跳出循环
                break
            # 解析邮件具体内容，并发送到企业微信
            send_content_to_wx(msg)
            if i == index:
                # 更新最新一封邮件
                msg = get_email_content(email_server, index)
                from_addr = parseaddr(msg.get('From'))[1]
                subject = decode_header(msg.get('Subject'))
                subject = subject[0][0].decode(subject[0][1]) if subject[0][1] else subject[0][0]
                mail_datetime = parse_mail_time(msg.get("date"))
                last_email = {
                    'email_from': from_addr,
                    'receive_time': mail_datetime.strftime("%Y-%m-%d %H:%M:%S"),
                    'email_subject': subject
                }
                # 保存到文件里面
                with open('last_email.pkl', 'wb') as file:
                    pickle.dump(last_email, file)
    # 别忘记退出
    email_server.quit()


if __name__ == '__main__':
    print(last_email)
    server = connect_email_by_pop3()
    parse_email_server(server, last_email)